--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
LXST/Network.py 1b77f0b8735315ecd5d0764bb03de69e8b8df1d8 (1b77f0b8) Text, 6.35 KB
T8b949e# Copyright 2024-2026, Mark Qvist
Tff7b72import T7ee787RNS
Tff7b72import T7ee787time
Tff7b72import T7ee787threading
Tff7b72from T7ee787.T7ee787Sinks Tff7b72import Te6edf3RemoteSink
Tff7b72from T7ee787.T7ee787Sources Tff7b72import Te6edf3RemoteSource
Tff7b72from T7ee787.T7ee787Codecs Tff7b72import Te6edf3NullTb4b4b4, Te6edf3codec_header_byteTb4b4b4, Te6edf3codec_type
Tff7b72from T7ee787collections Tff7b72import Te6edf3deque
Tff7b72from T7ee787RNST7ee787.T7ee787vendor Tff7b72import Te6edf3umsgpack Tff7b72as Te6edf3mp
Te6edf3FIELD_SIGNALLING Tff7b72= T79c0ff0x00
Te6edf3FIELD_FRAMES Tff7b72= T79c0ff0x01
Tff7b72class T56d364SignallingReceiverTb4b4b4(Tb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3proxyTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
T8b949e# TODO: Add inband signalling scheduler
Tff7b72selfTff7b72.Td2a8ffoutgoing_signals Tff7b72= Te6edf3dequeTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffproxy Tff7b72= Te6edf3proxy
Tff7b72def Td2a8ffhandle_signalling_fromTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4:
Te6edf3sourceTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_packetTb4b4b4)
Tff7b72def Td2a8ffsignalling_receivedTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3signalsTb4b4b4, Te6edf3sourceTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72selfTff7b72.Td2a8ffproxyTb4b4b4: Tff7b72selfTff7b72.Td2a8ffproxyTff7b72.Td2a8ffsignalling_receivedTb4b4b4(Te6edf3signalsTb4b4b4, Te6edf3sourceTb4b4b4)
Tff7b72def Td2a8ffsignalTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3signalTb4b4b4, Te6edf3destinationTb4b4b4, Te6edf3immediateTff7b72=Tff7b72TrueTb4b4b4)Tb4b4b4:
Te6edf3signalling_data Tff7b72= Tb4b4b4{Te6edf3FIELD_SIGNALLINGTb4b4b4:Tb4b4b4[Te6edf3signalTb4b4b4]Tb4b4b4}
Tff7b72if Te6edf3immediateTb4b4b4:
Te6edf3signalling_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Te6edf3destinationTb4b4b4, Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3signalling_dataTb4b4b4)Tb4b4b4, Te6edf3create_receiptTff7b72=Tff7b72FalseTb4b4b4)
Te6edf3signalling_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4:
T8b949e# TODO: Add inband signalling scheduler
Tff7b72pass
Tff7b72def Td2a8ff_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4, Te6edf3unpackedTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72tryTb4b4b4:
Tff7b72if Tff7b72not Te6edf3unpackedTb4b4b4: Te6edf3unpacked Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3dataTb4b4b4)
Te6edf3source Tff7b72= Te6edf3packetTff7b72.Td2a8fflink Tff7b72if Tffa657hasattrTb4b4b4(Te6edf3packetTb4b4b4, Ta5d6ff"Ta5d6fflinkTa5d6ff"Tb4b4b4) Tff7b72else Tff7b72None
Tff7b72if Tffa657typeTb4b4b4(Te6edf3unpackedTb4b4b4) Tff7b72== Tffa657dictTb4b4b4:
Tff7b72if Te6edf3FIELD_SIGNALLING Tff7b72in Te6edf3unpackedTb4b4b4:
Te6edf3signalling Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3FIELD_SIGNALLINGTb4b4b4]
Tff7b72if Tffa657typeTb4b4b4(Te6edf3signallingTb4b4b4) Tff7b72== Tffa657listTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsignalling_receivedTb4b4b4(Te6edf3signallingTb4b4b4, Te6edf3sourceTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsignalling_receivedTb4b4b4(Tb4b4b4[Te6edf3signallingTb4b4b4]Tb4b4b4, Te6edf3sourceTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff could not process incoming packet: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72class T56d364PacketizerTb4b4b4(Te6edf3RemoteSinkTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3destinationTb4b4b4, Te6edf3failure_callbackTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffdestination Tff7b72= Te6edf3destination
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffsource Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8fftransmit_failure Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ffsquelched Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8ff__failure_calback Tff7b72= Te6edf3failure_callback
Tff7b72def Td2a8ffhandle_frameTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3frameTb4b4b4, Te6edf3sourceTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4) Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLink Tff7b72and Tff7b72not Tff7b72selfTff7b72.Td2a8ffdestinationTff7b72.Td2a8ffstatus Tff7b72== Te6edf3RNSTff7b72.Td2a8ffLinkTff7b72.Td2a8ffACTIVETb4b4b4: Tff7b72return
Tff7b72if Tff7b72selfTff7b72.Td2a8ffsquelchedTb4b4b4: Tff7b72return
T8b949e# TODO: Add inband signalling scheduler
Te6edf3frame Tff7b72= Te6edf3codec_header_byteTb4b4b4(Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffsourceTff7b72.Td2a8ffcodecTb4b4b4)Tb4b4b4)Tff7b72+Te6edf3frame
Te6edf3packet_data Tff7b72= Tb4b4b4{Te6edf3FIELD_FRAMESTb4b4b4:Te6edf3frameTb4b4b4}
Te6edf3frame_packet Tff7b72= Te6edf3RNSTff7b72.Td2a8ffPacketTb4b4b4(Tff7b72selfTff7b72.Td2a8ffdestinationTb4b4b4, Te6edf3mpTff7b72.Td2a8ffpackbTb4b4b4(Te6edf3packet_dataTb4b4b4)Tb4b4b4, Te6edf3create_receiptTff7b72=Tff7b72FalseTb4b4b4)
Tff7b72if Te6edf3frame_packetTff7b72.Td2a8ffsendTb4b4b4(Tb4b4b4) Tff7b72== Tff7b72FalseTb4b4b4:
Tff7b72selfTff7b72.Td2a8fftransmit_failure Tff7b72= Tff7b72True
Tff7b72if Tffa657callableTb4b4b4(Tff7b72selfTff7b72.Td2a8ff__failure_calbackTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ff__failure_calbackTb4b4b4(Tb4b4b4)
T8b949e# TODO: Remove testing
T8b949e# if not hasattr(self, "frames"):
T8b949e# self.frames = 0
T8b949e# self.frame_bytes = 0
T8b949e# self.total_bytes = 0
T8b949e# self.total_bytes = 0
T8b949e# self.overhead_bytes = 0
T8b949e# self.frames += 1
T8b949e# self.frame_bytes += len(frame)
T8b949e# self.total_bytes += len(frame_packet.raw)
T8b949e# self.overhead_bytes += len(frame_packet.raw)-len(frame)
T8b949e# self.overhead_ratio = self.frame_bytes / self.total_bytes
T8b949e# if not hasattr(self, "started"):
T8b949e# self.started = time.time()
T8b949e# rate = 0
T8b949e# codec_rate = 0
T8b949e# else:
T8b949e# rate = (self.total_bytes*8)/(time.time()-self.started)
T8b949e# codec_rate = (self.frame_bytes*8)/(time.time()-self.started)
T8b949e# print(f"\rP={len(frame_packet.raw)}/{len(frame)}/{len(frame_packet.raw)-len(frame)} N={self.frames} E={round(self.overhead_ratio*100,0)}% O={RNS.prettysize(self.total_bytes)} F={RNS.prettysize(self.frame_bytes)} S={RNS.prettyspeed(rate)} C={RNS.prettyspeed(codec_rate)}", end=" ")
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff startingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72def Td2a8ffsquelchTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffsquelched Tff7b72= Tff7b72True
Tff7b72def Td2a8ffunsquelchTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4: Tff7b72selfTff7b72.Td2a8ffsquelched Tff7b72= Tff7b72False
Tff7b72class T56d364LinkSourceTb4b4b4(Te6edf3RemoteSourceTb4b4b4, Te6edf3SignallingReceiverTb4b4b4)Tb4b4b4:
Tff7b72def Tff7b72__init__Tb4b4b4(Tff7b72selfTb4b4b4, Te6edf3linkTb4b4b4, Te6edf3signalling_receiverTb4b4b4, Te6edf3sinkTff7b72=Tff7b72NoneTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
Tff7b72selfTff7b72.Td2a8fflink Tff7b72= Te6edf3link
Tff7b72selfTff7b72.Td2a8ffsink Tff7b72= Te6edf3sink
Tff7b72selfTff7b72.Td2a8ffcodec Tff7b72= Te6edf3NullTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8ffpipeline Tff7b72= Tff7b72None
Tff7b72selfTff7b72.Td2a8ffproxy Tff7b72= Te6edf3signalling_receiver
Tff7b72selfTff7b72.Td2a8ffreceive_lock Tff7b72= Te6edf3threadingTff7b72.Td2a8ffLockTb4b4b4(Tb4b4b4)
Tff7b72selfTff7b72.Td2a8fflinkTff7b72.Td2a8ffset_packet_callbackTb4b4b4(Tff7b72selfTff7b72.Td2a8ff_packetTb4b4b4)
Tff7b72def Td2a8ff_packetTb4b4b4(Tff7b72selfTb4b4b4, Te6edf3dataTb4b4b4, Te6edf3packetTb4b4b4)Tb4b4b4:
Tff7b72with Tff7b72selfTff7b72.Td2a8ffreceive_lockTb4b4b4:
Tff7b72tryTb4b4b4:
Te6edf3unpacked Tff7b72= Te6edf3mpTff7b72.Td2a8ffunpackbTb4b4b4(Te6edf3dataTb4b4b4)
Tff7b72if Tffa657typeTb4b4b4(Te6edf3unpackedTb4b4b4) Tff7b72== Tffa657dictTb4b4b4:
Tff7b72if Te6edf3FIELD_FRAMES Tff7b72in Te6edf3unpackedTb4b4b4:
Te6edf3frames Tff7b72= Te6edf3unpackedTb4b4b4[Te6edf3FIELD_FRAMESTb4b4b4]
Tff7b72if Tffa657typeTb4b4b4(Te6edf3framesTb4b4b4) Tff7b72!= Tffa657listTb4b4b4: Te6edf3frames Tff7b72= Tb4b4b4[Te6edf3framesTb4b4b4]
Tff7b72for Te6edf3frame Tff7b72in Te6edf3framesTb4b4b4:
Te6edf3frame_codec Tff7b72= Te6edf3codec_typeTb4b4b4(Te6edf3frameTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcodec Tff7b72and Tff7b72selfTff7b72.Td2a8ffsinkTb4b4b4:
Tff7b72if Tffa657typeTb4b4b4(Tff7b72selfTff7b72.Td2a8ffcodecTb4b4b4) Tff7b72!= Te6edf3frame_codecTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Ta5d6ffRemote switched codec to Tffd700{Te6edf3frame_codecTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpipelineTb4b4b4: Tff7b72selfTff7b72.Td2a8ffpipelineTff7b72.Td2a8ffcodec Tff7b72= Te6edf3frame_codecTb4b4b4(Tb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffcodec Tff7b72= Te6edf3frame_codecTb4b4b4(Tb4b4b4)Tb4b4b4; Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffsink Tff7b72= Tff7b72selfTff7b72.Td2a8ffsink
Te6edf3decoded_frame Tff7b72= Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3frameTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffchannelsTb4b4b4: Tff7b72selfTff7b72.Td2a8ffchannels Tff7b72= Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffchannels
Tff7b72elseTb4b4b4:
Te6edf3decoded_frame Tff7b72= Tff7b72selfTff7b72.Td2a8ffcodecTff7b72.Td2a8ffdecodeTb4b4b4(Te6edf3frameTb4b4b4[T79c0ff1Tb4b4b4:Tb4b4b4]Tb4b4b4)
Tff7b72if Tff7b72selfTff7b72.Td2a8ffpipelineTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsinkTff7b72.Td2a8ffhandle_frameTb4b4b4(Te6edf3decoded_frameTb4b4b4, Tff7b72selfTb4b4b4)
Tff7b72elseTb4b4b4: Tff7b72selfTff7b72.Td2a8ffsinkTff7b72.Td2a8ffhandle_frameTb4b4b4(Te6edf3decoded_frameTb4b4b4, Tff7b72selfTb4b4b4, Te6edf3decodedTff7b72=Tff7b72TrueTb4b4b4)
Tff7b72if Te6edf3FIELD_SIGNALLING Tff7b72in Te6edf3unpackedTb4b4b4:
Tffa657superTb4b4b4(Tb4b4b4)Tff7b72.Td2a8ff_packetTb4b4b4(Te6edf3dataTff7b72=Tff7b72NoneTb4b4b4, Te6edf3packetTff7b72=Te6edf3packetTb4b4b4, Te6edf3unpackedTff7b72=Te6edf3unpackedTb4b4b4)
Tff7b72except Tf85149Exception Tff7b72as Te6edf3eTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff could not process incoming packet: Tffd700{Te6edf3eTffd700}Ta5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_ERRORTb4b4b4)
Te6edf3RNSTff7b72.Td2a8fftrace_exceptionTb4b4b4(Te6edf3eTb4b4b4)
Tff7b72def Td2a8ffstartTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72if Tff7b72not Tff7b72selfTff7b72.Td2a8ffshould_runTb4b4b4:
Te6edf3RNSTff7b72.Td2a8fflogTb4b4b4(Ta5d6fffTa5d6ff"Tffd700{Tff7b72selfTffd700}Ta5d6ff startingTa5d6ff"Tb4b4b4, Te6edf3RNSTff7b72.Td2a8ffLOG_DEBUGTb4b4b4)
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72True
Tff7b72def Td2a8ffstopTb4b4b4(Tff7b72selfTb4b4b4)Tb4b4b4:
Tff7b72selfTff7b72.Td2a8ffshould_run Tff7b72= Tff7b72False
──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────